package intelligentCustomer.knowledge;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 知识库类
 * 管理产品信息和常见问题解答，提供相关知识检索功能
 */
public class KnowledgeBase {
    /** 产品信息，按产品类别组织 */
    private Map<String, List<String>> productInfo = new HashMap<>();
    
    /** 常见问题解答，按问题类别组织 */
    private Map<String, List<String>> faqEntries = new HashMap<>();
    
    /** 产品信息对象集合 */
    private Map<String, ProductInfo> products = new HashMap<>();
    
    /** FAQ项目集合 */
    private List<FAQItem> faqItems = new ArrayList<>();
    
    /**
     * 构造函数，初始化知识库内容
     */
    public KnowledgeBase() {
        initializeKnowledgeBase();
    }
    
    /**
     * 初始化知识库内容
     * 添加示例产品信息和常见问题
     */
    private void initializeKnowledgeBase() {
        // 产品信息示例 - 智能手机
        List<String> smartphoneInfo = new ArrayList<>();
        smartphoneInfo.add("智能手机X1: ¥3999, 6.7寸屏幕, 8GB内存, 128GB存储");
        smartphoneInfo.add("智能手机X2: ¥4999, 6.9寸屏幕, 12GB内存, 256GB存储");
        productInfo.put("smartphone", smartphoneInfo);
        
        // 产品信息示例 - 笔记本电脑
        List<String> laptopInfo = new ArrayList<>();
        laptopInfo.add("笔记本Y1: ¥6999, 15.6寸屏幕, i5处理器, 16GB内存");
        laptopInfo.add("笔记本Y2: ¥9999, 16寸屏幕, i7处理器, 32GB内存");
        productInfo.put("laptop", laptopInfo);
        
        // FAQ示例 - 支付相关
        List<String> paymentFaq = new ArrayList<>();
        paymentFaq.add("问: 支持哪些支付方式?\n答: 我们支持支付宝、微信支付、银联卡和信用卡支付。");
        paymentFaq.add("问: 如何申请退款?\n答: 您可以在订单详情页点击'申请退款'按钮，并填写退款原因。");
        faqEntries.put("payment", paymentFaq);
        
        // FAQ示例 - 配送相关
        List<String> shippingFaq = new ArrayList<>();
        shippingFaq.add("问: 配送时间是多久?\n答: 正常情况下，大城市地区1-3天送达，偏远地区3-7天送达。");
        shippingFaq.add("问: 是否支持货到付款?\n答: 是的，我们在大部分城市地区支持货到付款服务。");
        faqEntries.put("shipping", shippingFaq);
        
        // 初始化结构化产品信息
        ProductInfo smartphone1 = new ProductInfo("智能手机X1", "smartphone", 3999);
        smartphone1.addFeature("屏幕", "6.7寸");
        smartphone1.addFeature("内存", "8GB");
        smartphone1.addFeature("存储", "128GB");
        products.put("smartphone1", smartphone1);
        
        ProductInfo smartphone2 = new ProductInfo("智能手机X2", "smartphone", 4999);
        smartphone2.addFeature("屏幕", "6.9寸");
        smartphone2.addFeature("内存", "12GB");
        smartphone2.addFeature("存储", "256GB");
        products.put("smartphone2", smartphone2);
        
        ProductInfo laptop1 = new ProductInfo("笔记本Y1", "laptop", 6999);
        laptop1.addFeature("屏幕", "15.6寸");
        laptop1.addFeature("处理器", "i5");
        laptop1.addFeature("内存", "16GB");
        products.put("laptop1", laptop1);
        
        ProductInfo laptop2 = new ProductInfo("笔记本Y2", "laptop", 9999);
        laptop2.addFeature("屏幕", "16寸");
        laptop2.addFeature("处理器", "i7");
        laptop2.addFeature("内存", "32GB");
        products.put("laptop2", laptop2);
        
        // 初始化FAQ项目
        faqItems.add(new FAQItem("支持哪些支付方式?", "我们支持支付宝、微信支付、银联卡和信用卡支付。", "payment"));
        faqItems.add(new FAQItem("如何申请退款?", "您可以在订单详情页点击'申请退款'按钮，并填写退款原因。", "payment"));
        faqItems.add(new FAQItem("配送时间是多久?", "正常情况下，大城市地区1-3天送达，偏远地区3-7天送达。", "shipping"));
        faqItems.add(new FAQItem("是否支持货到付款?", "是的，我们在大部分城市地区支持货到付款服务。", "shipping"));
    }
    
    /**
     * 获取与用户查询相关的知识
     * 根据查询内容和意图类别检索相关信息
     * 
     * @param query 用户查询内容
     * @param intentCategory 识别的意图类别
     * @return 相关知识文本
     */
    public String getRelevantKnowledge(String query, String intentCategory) {
        StringBuilder relevantInfo = new StringBuilder();
        
        // 检索手机相关信息
        if (query.contains("手机") || query.contains("智能手机")) {
            relevantInfo.append("产品信息:\n");
            for (String info : productInfo.get("smartphone")) {
                relevantInfo.append(info).append("\n");
            }
        }
        
        // 检索电脑相关信息
        if (query.contains("笔记本") || query.contains("电脑")) {
            relevantInfo.append("产品信息:\n");
            for (String info : productInfo.get("laptop")) {
                relevantInfo.append(info).append("\n");
            }
        }
        
        // 检索支付相关FAQ
        if (query.contains("支付") || query.contains("付款") || "payment".equals(intentCategory)) {
            relevantInfo.append("支付相关:\n");
            for (String faq : faqEntries.get("payment")) {
                relevantInfo.append(faq).append("\n");
            }
        }
        
        // 检索配送相关FAQ
        if (query.contains("配送") || query.contains("物流") || query.contains("送货") || 
            "shipping".equals(intentCategory)) {
            relevantInfo.append("配送相关:\n");
            for (String faq : faqEntries.get("shipping")) {
                relevantInfo.append(faq).append("\n");
            }
        }
        
        return relevantInfo.toString();
    }

    /**
     * 检索与查询相关的信息
     * 
     * @param query 用户查询
     * @param category 意图类别
     * @return 相关知识信息
     */
    public String retrieveRelevantInfo(String query, String category) {
        StringBuilder result = new StringBuilder();
        
        // 检索相关产品信息
        List<ProductInfo> relevantProducts = findRelevantProducts(query, category);
        if (!relevantProducts.isEmpty()) {
            result.append("相关产品信息:\n");
            for (ProductInfo product : relevantProducts) {
                result.append("- ").append(product.getName()).append(" (¥").append(product.getPrice()).append(")\n");
                for (Map.Entry<String, String> feature : product.getFeatures().entrySet()) {
                    result.append("  ").append(feature.getKey()).append(": ").append(feature.getValue()).append("\n");
                }
                result.append("\n");
            }
        }
        
        // 检索相关FAQ
        List<FAQItem> relevantFAQs = findRelevantFAQs(query, category);
        if (!relevantFAQs.isEmpty()) {
            result.append("常见问题:\n");
            for (FAQItem faq : relevantFAQs) {
                result.append("Q: ").append(faq.getQuestion()).append("\n");
                result.append("A: ").append(faq.getAnswer()).append("\n\n");
            }
        }
        
        return result.toString();
    }

    /**
     * 查找相关产品
     * 
     * @param query 用户查询
     * @param category 意图类别
     * @return 相关产品列表
     */
    private List<ProductInfo> findRelevantProducts(String query, String category) {
        List<ProductInfo> results = new ArrayList<>();
        
        for (ProductInfo product : products.values()) {
            // 简单的关键词匹配
            if (query.contains(product.getCategory()) || 
                query.contains(product.getName()) ||
                (category.equals("产品") && isRelevantToQuery(product, query))) {
                results.add(product);
            }
        }
        
        return results;
    }

    /**
     * 判断产品是否与查询相关
     * 
     * @param product 产品信息
     * @param query 用户查询
     * @return 是否相关
     */
    private boolean isRelevantToQuery(ProductInfo product, String query) {
        // 简单的关键词匹配逻辑
        for (String feature : product.getFeatures().values()) {
            if (query.contains(feature)) {
                return true;
            }
        }
        
        return query.contains(product.getCategory());
    }

    /**
     * 查找相关FAQ
     * 
     * @param query 用户查询
     * @param category 意图类别
     * @return 相关FAQ列表
     */
    private List<FAQItem> findRelevantFAQs(String query, String category) {
        List<FAQItem> results = new ArrayList<>();
        
        for (FAQItem faq : faqItems) {
            // 简单的关键词匹配
            if (query.contains(faq.getCategory()) || 
                query.contains(extractKeywords(faq.getQuestion())) ||
                category.equals(faq.getCategory())) {
                results.add(faq);
            }
        }
        
        return results;
    }

    /**
     * 提取问题中的关键词
     * 
     * @param question FAQ问题
     * @return 关键词
     */
    private String extractKeywords(String question) {
        // 简单实现，实际应用中可使用NLP技术提取关键词
        return question.replace("如何", "")
                      .replace("是什么", "")
                      .replace("？", "")
                      .replace("?", "");
    }

    /**
     * 初始化产品信息
     */
    public void initializeProductInfo() {
        // 这个方法已在构造函数中的initializeKnowledgeBase()调用过
        // 可以留空或添加额外的产品信息初始化代码
    }

    /**
     * 初始化常见问题
     */
    public void initializeFAQ() {
        // 这个方法已在构造函数中的initializeKnowledgeBase()调用过
        // 可以留空或添加额外的FAQ初始化代码
    }
}